import java.util.ArrayList;



public class Cargador {
  private ArrayList<String> imagenes;
  private String ruta;
  private int pos;
  private PImage imgAct;
  private ArrayList etiquetas;
  private String[] nombres;
  private XMLElement element;
  private XMLElement e;
  private int xmlPos;
  private int nEtiqueta=-1;
  private ArrayList<Etiqueta> deshacer;
  Etiqueta minima=null;
  Etiqueta etMin=null;
  private int xact=0;
  private int yact=0;

  public Cargador(String ruta) {
    this.ruta = ruta;
    deshacer = new ArrayList();
  }

  public void cargar(PApplet parent,Explorador explorador) {
    imagenes = new ArrayList();
    xmlPos=-1;
    boolean t = false;
    nombres = listarArchivos(ruta);
    println(nombres);
    for(int i= 0; i< nombres.length;i++) {
      
      String nombre = nombres[i];
      
      if(nombre.endsWith("xml")) {
        if(nombre.equals("tree.xml")){
        xmlPos=i;}
        else if(nombre.equals("tools.xml")){
         explorador.cargarConf(parent,this.ruta+"tools.xml"); 
         t=true;
        }
        
      }
      else if(nombre.endsWith("jpg")|| nombre.endsWith("gif") || nombre.endsWith("jpeg") || nombre.endsWith("tga") || nombre.endsWith("png")) {
        println("cargando "+nombre+" i: "+i);
        imagenes.add(ruta+nombres[i]);
      }
    }
    if(!t){
      explorador.cargarConf(parent,"tools.xml");
    }
    pos=0;
    println("acabo de cargar");
    imgAct =(PImage)loadImage((String)imagenes.toArray()[0]);
    
    etiquetas = new ArrayList();
    for(int i = 0 ; i < imagenes.size();i++) {
      etiquetas.add(new ArrayList());
      println("añadiendo array etiquetas"+" "+i);
    }
    if(xmlPos!=-1) {
      cargarXml(nombres[xmlPos],parent);
    }
  }
  void cargarXml(String nombre,PApplet parent) {
    element = new XMLElement(parent,ruta+nombre);

    for (int i=0; i < element.getChildCount(); i++) {
      XMLElement imagen = element.getChild(i);
      String nImagen = imagen.getAttribute("src");
      for(int j = 0; j<nombres.length;j++) {
        if(nombres[j].equals(nImagen)) {
          for(int k = 0; k<imagen.getChildCount();k++) {
            XMLElement etiqueta = imagen.getChild(k);
            println(etiqueta);
            if(etiqueta.getName().equals("Square")) {
              String n = etiqueta.getStringAttribute("name");
              int x = Integer.valueOf(etiqueta.getStringAttribute("x")); 
              int y = Integer.valueOf(etiqueta.getStringAttribute("y"));
              float ancho = Float.valueOf(etiqueta.getStringAttribute("width"));
              float alto = Float.valueOf(etiqueta.getStringAttribute("height"));
              println(x+" "+y+" "+ancho+" "+alto);
              
              agregarEtiqueta(j,new Etiqueta(x,y,ancho,alto,n));
            }
            
            if(etiqueta.getName().equals("Point")) {
              String n = etiqueta.getStringAttribute("name");
              int x = Integer.valueOf(etiqueta.getStringAttribute("x")); 
              int y = Integer.valueOf(etiqueta.getStringAttribute("y"));
              println(x+" "+y);
              agregarEtiqueta(j,new Etiqueta(x,y,n));
            }

            else if(etiqueta.getName().equals("Circle")) {
              String n = etiqueta.getStringAttribute("name");
              int x = Integer.valueOf(etiqueta.getStringAttribute("x")); 
              int y = Integer.valueOf(etiqueta.getStringAttribute("y"));
              float radio = Float.valueOf(etiqueta.getStringAttribute("radio"));
              agregarEtiqueta(j,new Etiqueta(x,y,radio,n));
            }
            else if(etiqueta.getName().equals("Poligon")){
              String n = etiqueta.getStringAttribute("name");
              ArrayList p = new ArrayList();
              for(int l = 0; l<etiqueta.getChildCount();l++){
               XMLElement pol = etiqueta.getChild(l);
                int[] punto = new int[2];
                 punto[0] = Integer.valueOf(pol.getStringAttribute("x")); 
                 punto[1] = Integer.valueOf(pol.getStringAttribute("y")); 
                 println("añado punto");
                 p.add(punto);
              }
              agregarEtiqueta(j,new Etiqueta(p,n,3));
            }
             else if(etiqueta.getName().equals("Pointsec")){
              String n = etiqueta.getStringAttribute("name");
              ArrayList p = new ArrayList();
              for(int l = 0; l<etiqueta.getChildCount();l++){
               XMLElement pol = etiqueta.getChild(l);
                int[] punto = new int[2];
                 punto[0] = Integer.valueOf(pol.getStringAttribute("x")); 
                 punto[1] = Integer.valueOf(pol.getStringAttribute("y")); 
                 p.add(punto);
              }
              agregarEtiqueta(j,new Etiqueta(p,n,5));
            }
          }
        }
      }
    }
  }



public int getNImagenes(){
 return imagenes.size(); 
}

  String[] listarArchivos(String dir) {
    File file = new File(dir);
    if(file.isDirectory()) {
      String names[] = file.list();
      return names;
    }
    else {
      return null;
    }
  }
  public Etiqueta getUltimaEtiqueta(int imagenActual){
    println(nEtiqueta);
    ArrayList et = (ArrayList)etiquetas.get(imagenActual);
    println(nEtiqueta);
    return (Etiqueta)et.get(nEtiqueta-1);
    
  }
  public void agregarEtiqueta(int nImagen,Etiqueta etiqueta) {
    
    ArrayList e = (ArrayList)etiquetas.get(nImagen);
    
    e.add(etiqueta);
    nEtiqueta++;
  }
  public void resetMinima(){
    minima=null;
  }
  
  public void dibujaretiquetas(int imagenActual,int offsetx,int offsety,boolean elim,float zoom,float zoomy,float dragX,float dragY) {
    nEtiqueta=0;
    
    
    float distmin=1000;
    ArrayList e = (ArrayList)etiquetas.get(imagenActual);
    Iterator i = e.iterator();
    while(i.hasNext()) {
      Etiqueta et = (Etiqueta) i.next();
      et.display(offsetx,offsety,false,zoom,zoomy,dragX,dragY);
      
       if(xact!=mouseX && yact!=mouseY){ 
      if(distmin > et.getMinDist((int)offsetx,(int)offsety,zoom,zoomy,dragX,dragY)){
        distmin=et.getMinDist((int)offsetx,(int)offsety,zoom,zoomy,dragX,dragY);
        minima = et;
       
      }}
      nEtiqueta++;
    }
    if(xact!=mouseX && yact!=mouseY){
      xact=mouseX;
      yact=mouseY;
    }
    
    if(elim & minima !=null){
     minima.display( offsetx,offsety,true,zoom,zoomy,dragX,dragY);
    }
    
  }
  public void deshacer(int imagenActual){
    
    if(deshacer.size()!=0){
    ArrayList e = (ArrayList)etiquetas.get(imagenActual);
    Etiqueta et = deshacer.get(deshacer.size()-1);
    e.add(et);
    deshacer.remove(et);
    
    }
  }
  public boolean pressEtiquetas(int imagenActual,int offsetx,int offsety,float zoom,float dragX,float dragY) {
    ArrayList e = (ArrayList)etiquetas.get(imagenActual);
    Iterator i = e.iterator();
    while(i.hasNext()) {
      Etiqueta et = (Etiqueta) i.next();
      if(et.isPressed(offsetx,offsety,zoom,dragX,dragY)){
       e.remove(et);
       deshacer.add(et);
      return true ;
      }
    }
    return false;
  }

  public ArrayList<String> getImagenes() {
    return imagenes;
  }

  public void guardarEtiquetas() {
    PrintWriter output = createWriter(ruta+"tree.xml");
    output.println("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");

    Iterator i = etiquetas.iterator();
    int contador=0;
    // e = new proxml.XMLElement("Imagenes");
    output.println("<Images>");
    while(i.hasNext()) {
      ArrayList et = (ArrayList)i.next();
      Iterator i2 = et.iterator(); 
      output.println("\t <img src=\""+nombres[contador]+"\">");
      //proxml.XMLElement img = new proxml.XMLElement("img");

      //img.addAttribute("src",nombres[contador]);
      //e.addChild(img);
      contador++; 

      while(i2.hasNext()) {
        Etiqueta etiqueta = (Etiqueta)i2.next();
        etiqueta.agregarTree(output);
      }
      output.println("\t</img>");
    }
    output.println("</Images>");

    // xmlIO.saveElement(e,ruta+"tree.xml");
    output.flush();
    output.close();
  }
  
  public int getNumEtiquetas(){
    return nEtiqueta;
  }
  public int agregarEtiquetasMenu(ListBox l,int imagenActual){
    int numEt=0;
    
    ArrayList et = (ArrayList)etiquetas.get(imagenActual);
    Iterator i = et.iterator();
    while(i.hasNext()){
      Etiqueta e = (Etiqueta) i.next();
      println("Label: "+e);
      l.addItem(e.getNombre(),numEt);
      println("agrego el numero de etiqueta "+numEt);
      numEt++;
    }
    println("label: "+numEt);
    nEtiqueta = numEt-1;
    return numEt;
  }
  
  public boolean borrarEtiqueta(int imagenActual){
    ArrayList a = (ArrayList) etiquetas.get(imagenActual);
    if(minima!=null){
      
     a.remove(minima);
     
     deshacer.add(minima);
     println("minima: "+minima);
    minima=null; 
    return true;
    }
    return false;
    /*if(a.size() > 1){
    for(int i = numero ;i < a.size()-1;i++){
    a.set(i,a.get(i+1));
    
    }
    
     a.set(a.size()-2,a.get(a.size()-1));
     a.remove(a.size()-1);
     a.trimToSize();
     println("llego");
    }*/
    
  }
  
  void setEtMin(){
   etMin = minima; 
   println(etMin);
  }
  
  Etiqueta getEtiquetaModif(){
    
    if(etMin!=null){
      println(etMin);
      return etMin;}
      return null;
  }
}

